package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.AreaConcentracion;
import Dominio.Asignatura;
import Dominio.AsignaturaOptativa;
import Dominio.ProgramaEducativo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DAOAsignaturaOptativa {
    private static final String COLUMNA_CVE_ASIGNATURA = "cveAsignatura";
    private static final String COLUMNA_CVE_PROGRAMA = "cveProgramaEducativo";
    private static final String COLUMNA_CVE_AREA_CONCENTRACION = "cveAreaConcentracion";
    private static final String TABLA_OPTATIVAS = "optativas";
    private static final String COLUMNA_ID = "id";
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    private Connection conexion = null;
    private DAOAsignatura daoAsignatura;

    public DAOAsignaturaOptativa() {
        this.conexion = this.acceso.abrirConexion();
        this.daoAsignatura = new DAOAsignatura();
    }
    
    public boolean existeOptativa(AsignaturaOptativa optativa){
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String querySearch = "SELECT * FROM "+ TABLA_OPTATIVAS + " WHERE " + COLUMNA_CVE_ASIGNATURA
                    +" = '"+optativa.getClave_asignatura()+"' AND "+COLUMNA_CVE_PROGRAMA+" = '"+optativa.getPrograma().getCvePrograma()
                    +"' AND "+COLUMNA_CVE_AREA_CONCENTRACION+" ='"+optativa.getArea().getClaveArea()+"'";
            ResultSet resultado = sentencia.executeQuery(querySearch);
            System.out.println(resultado.getRow());
            int contadorDeRegistros = 0;
            while (resultado.next()) {
                contadorDeRegistros++;
            }

            if (contadorDeRegistros != 0) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    
    public void registrarAsignaturaOptativa(AsignaturaOptativa optativa){
        //if(!this.existeOptativa(optativa)){
            if(this.daoAsignatura.existeAsignatura(optativa)){
                try {
                    Asignatura asignatura = daoAsignatura.buscaAsignatura(optativa.getNombre());                   
                    
                    int cveAsignatura = asignatura.getClave_asignatura();
                    int cvePrograma = optativa.getPrograma().getCvePrograma();
                    int cveAreaConcentracion = optativa.getArea().getClaveArea();
                    Statement sentencia = acceso.crearSentenciaBD(conexion);
                    String queryInsertar = "INSERT INTO " + TABLA_OPTATIVAS + " (" + COLUMNA_CVE_ASIGNATURA + ","+COLUMNA_CVE_PROGRAMA+","
                            +COLUMNA_CVE_AREA_CONCENTRACION+") VALUES ('"+cveAsignatura+"','"+cvePrograma+"','"+cveAreaConcentracion+"')";
                    sentencia.executeUpdate(queryInsertar);
                } catch (SQLException ex) {
                    System.out.println("Ocurrió un problema al tratar de registrar la asignatura");
                }
            }else{
                Asignatura asignatura = daoAsignatura.registraAsignatura(optativa);
                AsignaturaOptativa aoptativa = new AsignaturaOptativa(optativa.getArea(),asignatura.getClave_asignatura(),asignatura.getNombre());
                aoptativa.setPrograma(optativa.getPrograma());
                this.registrarAsignaturaOptativa(aoptativa);
            }
//        }else{
//            System.out.println("Ya existe la asignatura optativa que intenta registrar.");
//        }
    }
    public void registrarAsignaturaOptativa(int cveAsignatura,int cvePrograma,int cveAreaConcentracion){
        
        if(!this.existeOptativa(cveAsignatura,cvePrograma,cveAreaConcentracion)){
            try {                
                Statement sentencia = acceso.crearSentenciaBD(conexion);
                String queryInsertar = "INSERT INTO " + TABLA_OPTATIVAS + " (" + COLUMNA_CVE_ASIGNATURA + ","+COLUMNA_CVE_PROGRAMA+","
                        +COLUMNA_CVE_AREA_CONCENTRACION+") VALUES ('"+cveAsignatura+"','"+cvePrograma+"','"+cveAreaConcentracion+"')";
                sentencia.executeUpdate(queryInsertar);
            } catch (SQLException ex) {
                System.out.println("Ocurrió un problema al tratar de registrar la asignatura");
                ex.printStackTrace();
            }
        }else{
            System.out.println("Ya existe la asignatura optativa que intenta registrar.");
        }
    }

    private boolean existeOptativa(int cveAsignatura, int cvePrograma, int cveAreaConcentracion) {
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String querySearch = "SELECT * FROM "+ TABLA_OPTATIVAS + " WHERE " + COLUMNA_CVE_ASIGNATURA
                    +" = '"+cveAsignatura+"' AND "+COLUMNA_CVE_PROGRAMA+" = '"+cvePrograma
                    +"' AND "+COLUMNA_CVE_AREA_CONCENTRACION+" ='"+cveAreaConcentracion+"'";
            ResultSet resultado = sentencia.executeQuery(querySearch);
            System.out.println(resultado.getRow());
            int contadorDeRegistros = 0;
            while (resultado.next()) {
                contadorDeRegistros++;
            }

            if (contadorDeRegistros != 0) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    
    protected boolean registrarOptativas(ProgramaEducativo programa){
        boolean exito = false;
        ArrayList<AsignaturaOptativa> optativas = programa.getReticula().getAsignaturasOptativas();
        DAOAreaConcentracion daoAreaConcentracion = new DAOAreaConcentracion();
        for(int i=0;i<optativas.size();i++){
            AsignaturaOptativa optativa = optativas.get(i);
            //optativa.setPrograma(programa);
            AreaConcentracion area  = daoAreaConcentracion.registraAreaConcentracion(optativa.getArea());
            optativa.setArea(area);
            this.registrarAsignaturaOptativa(optativa);
            exito = true;
        }
        return exito;
    }
    
    public ArrayList<AsignaturaOptativa> obtenerOptativasProgramaEducativo(int claveProgramaEducativo){
        ArrayList<AsignaturaOptativa> optativas = new ArrayList<AsignaturaOptativa>();
        DAOAreaConcentracion daoArea = new DAOAreaConcentracion();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_CVE_PROGRAMA+"='"+claveProgramaEducativo+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int id = resultado.getInt(1);
                int cveAsignatura = resultado.getInt(2);
                int cveArea = resultado.getInt(3);
                AreaConcentracion area = daoArea.obtenerArea(cveArea);
                Asignatura asignatura = daoAsignatura.buscarAsignatura(cveAsignatura);
                AsignaturaOptativa optativa = new AsignaturaOptativa(area, asignatura.getClave_asignatura(), asignatura.getNombre());
                optativas.add(optativa);
            }
            return optativas;
        }catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    public int obtenerClaveAreaDeConcentracionDeLaAsignatura(int claveAsignatura) {
        int claveAreaConcentracion = -1;
        
        try {                        
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+COLUMNA_CVE_AREA_CONCENTRACION+" FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_CVE_ASIGNATURA+" = '"+claveAsignatura+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            
            while(resultado.next()){
                claveAreaConcentracion = resultado.getInt(1);
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return claveAreaConcentracion;
    }
    
     public void cerrarConexionAAsignaturaOptativa() {
        acceso.cerrarConexion(conexion);
    }
     
    public AsignaturaOptativa obtenerAsignaturaOptativa(int claveAsignaturaOptativa) {
        AsignaturaOptativa asignaturaOptativa = new AsignaturaOptativa();
        
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_ID+" = '"+claveAsignaturaOptativa+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            
            while(resultado.next()) {
                int claveAsignatura = resultado.getInt(2);
                int claveAreaConcentracion = resultado.getInt(3);                                        
                
                DAOAsignatura daoAsignaturas = new DAOAsignatura();
                Asignatura asignatura = daoAsignaturas.buscarAsignatura(claveAsignatura);
                daoAsignaturas.cerrarConexionAAsignatura();
                
                DAOAreaConcentracion daoAreaConcentracion = new DAOAreaConcentracion();
                AreaConcentracion areaConcentracion = daoAreaConcentracion.obtenerArea(claveAreaConcentracion);
                daoAreaConcentracion.cerrarConexionAAreaConcentracion();
                                
                asignaturaOptativa.setAsignatura(asignatura); 
                asignaturaOptativa.setArea(areaConcentracion);
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return asignaturaOptativa;
    }
    
}
